import {defineStore} from 'pinia'
import {toLogin, Logout} from "@/api/login.js";
import {ChangeRoleIdMenus} from "@/api/sysRole.js"
import router from "@/router/index.js";
import {useSkeletonStore} from "@/stores/skeleton.js";
import {useMenuTabStore} from "@/stores/menuTab.js";

// useStore 可以是 useUser、useCart 之类的任何东西
// 第一个参数是应用程序中 store 的唯一 id

// 用户状态管理
export const useUserStore = defineStore('user', {

    // 定义状态
    state: () => ({
        // 登录用户
        user: {},
        userId: '',
        username: '',
        // 登录token
        token: '',
        // 用户挤下线
        uuid: '',
        // 用户对应的角色列表
        roles: [],
        // 定义当前角色属性
        currRoleId:0,
        currRoleName:"",
        currRoleCode:"",
        // 获取角色对应的权限
        permissions: [],
        // 获取角色对应的菜单
        menuTree: []
    }),

    // 计算属性，相当于computed
    getters: {
        // 判断是否登录
        isLogin(state) {
            return state.token ? true : false
        },

        getRoles(state) {
            return state.roles.map(m => m.id + ": " + m.name).join(", ")
        },
        getPermissions(state) {
            return state.permissions.map(m => m.id + ": " + m.name).join(", ")
        }

    },


    // 定义动作
    actions: {

        /*设置toekn*/
        setToken(newToken) {
            this.token = newToken
        },

        /*获取token*/
        getToken() {
            return this.token
        },

        /*获取uuid*/
        getUUID(){
            return this.uuid
        },

        // 改变用户角色把对应的菜单和权限查询出来
        async handlePianaRole (roleId,roleName,roleCode) {
            // 判断是否是当前角色
            if (roleId  > 0  && roleId != this.currRoleId){
                this.currRoleId = roleId
                this.currRoleName = roleName
                this.currRoleCode = roleCode
            }
            // 获取导航的菜单标签页，切换角色后清空
            const menuTabStore =  useMenuTabStore()
            menuTabStore.clearTabs()

            // 根据用户切换的角色，找到角色对应的菜单
            const resp = await ChangeRoleIdMenus({roleId:this.currRoleId})
            // 把对应的权限和菜单进行覆盖
            this.permissions = resp.data.permissions
            this.menuTree = resp.data.roleMenus.sort((a,b)=>a.sort-b.sort)
            if(roleId > 0){
                // 激活菜单中的第一个路由
                router.push(this.menuTree[0].path)
            }
        },


        /*登录*/
        async toLogin(loginUser) {
            // 调用登录接口
            const resp = await toLogin(loginUser)
            const {user, token,uuid, roles,roleMenus, permissions} = resp.data
            this.user = user
            this.userId = user.id
            this.username = user.account
            this.token = token
            this.uuid = uuid
            this.roles = roles
            this.permissions = permissions
            // 获取菜单数据
            this.menuTree = roleMenus
            // 把roles列表中的角色的第一个作为，当前角色
            this.currRoleId = roles && roles.length > 0 ? roles[0].id : 0
            this.currRoleName = roles && roles.length > 0 ? roles[0].roleName : ""
            this.currRoleCode = roles && roles.length > 0 ? roles[0].roleCode : ""
            return Promise.resolve(resp)
        },

        /*退出登录*/
        async logout() {
            // 调用退出登录的接口
            await Logout()
            // 清除状态信息
            this.token = ''
            this.uuid = ''
            this.user = {}
            this.username = ''
            this.userId = ''
            this.roles = []
            this.permissions = []
            this.menuTree = []
            // 清除自身的本地存储
            localStorage.removeItem("kong-kva-language") // 国际化状态管理
            localStorage.removeItem("kong-pinia-userstore") // 用户状态管理
            localStorage.removeItem("kong-pinia-menutabs") // 菜单标签页状态管理
            sessionStorage.removeItem("kong-pinia-skeleton") // 骨架屏状态管理
            // 把骨架屏的状态恢复到true的状态
            useSkeletonStore().setLoading(true)
            // 然后跳转到登录
            // router.push({name: 'Login', replace: true})
            // 刷新当前页面
            location.reload();
        }
    },

    persist: {
        key: 'kong-pinia-userstore',
        storage: localStorage, // sessionStorage
    }
})
